首先先写个配置类,然后把拦截类 通过Bean的形式注入


package com.xiwi.vip.ziti.common.config;

import com.xiwi.vip.ziti.common.interceptor.LoginHandlerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;

@Configuration
public class IntercepterConfig implements WebMvcConfigurer {

// 自己写的处理类
@Bean
public LoginHandlerInterceptor getLoginHandlerInterceptor() {
return new LoginHandlerInterceptor();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getLoginHandlerInterceptor())
.excludePathPatterns(new ArrayList<String>() {{
add("/admin/oauth/**");
}})
.addPathPatterns("/admin/**");
}
}

LoginHandlerInterceptor拦截处理器

package com.xiwi.vip.ziti.common.interceptor;

import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.xiwi.vip.ziti.common.admin.AdminLoginUser;
import com.xiwi.vip.ziti.common.core.RedisUtil;
import com.xiwi.vip.ziti.common.core.ResultJson;
import com.xiwi.vip.ziti.common.exception.ApplicationRunTimeException;
import com.xiwi.vip.ziti.entity.AdminUser;
import com.xiwi.vip.ziti.service.AdminRoleService;
import com.xiwi.vip.ziti.service.AdminUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Slf4j
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Resource
private TimedCache<String, Object> timedCache;
@Resource
private RedisUtil redisUtil;
@Resource
private AdminUserService adminUserService;
@Resource
private AdminRoleService adminRoleService;


@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
String token = request.getHeader("admin-auth");

log.info(token);

if (StrUtil.isBlankIfStr(token)) {
throw new ApplicationRunTimeException(ResultJson.response(-1000, "未登录"));

}

if (ObjectUtil.hasNull(redisUtil.get(token))) {
throw new ApplicationRunTimeException(ResultJson.response(-1000, "未登录"));

}

JSONObject adminUserJson = redisUtil.get(token, JSONObject.class);
AdminUser adminUser = adminUserService.lambdaQuery()
.eq(AdminUser::getId, adminUserJson.getStr("admin_id"))
.one();
System.out.println(
"login:" + adminUser.toString()
);
adminUser.setPassword("");


AdminLoginUser.setAdminLoginUser(adminUser, adminRoleService.getAuthIdsByRoleId(adminUser.getRoleId()));
redisUtil.set(token, AdminLoginUser.getAdminLoginUser(), 86400);

return true;
}
}
Q:为什么要通过Bean的形式引入,我直接new进去不可以吗? 直接new进去也可以 registry.addInterceptor(new LoginHandlerInterceptor()) 但拦截器里面有用到其它ioc容器上其它的Bean。
直接new进去没办法取到其它bean 这个是Spring的Bean加载流程问题 如果你拦截器中没有用到其它Spring管理的Bean 自己在拦截器中new类也是可以的